<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>constructor</title>
</head>
<body>
    
</body>
</html>

<script>

    //constructor
    //super 指调用父类的引用，在构造函数constructor中必须先调用super

    //super()指调用父类的构造函数
    //必须在constructor 函数里this调用之前执行super()  不然会报错 

    // class User{
    //     constructor(name){
    //         this.name = name;
    //     }
    //     show(){
    //         console.log(this.name);
    //     }
    // }


    
    // class Admin extends User{
    //     constructor(name){
    //         super(name);
    //     }
    // }

    // let hd = new Admin("后盾人");
    // hd.show();


    //constructor 中先调用super 方法的原理如下
    // function Parent(name){
    //     this.name = name;
    // }

    // function User(...args){
    //     Parent.apply(this,args);
    // }

    // User.prototype = Object.create(User.prototype);
    // User.prototype.constructor = User;
    // const hd = new User("后盾人");
    // console.log(hd.name);


    //父类方法
    //使用super()可以执行父类方法

    //子类不添加构造方法  默认会继承父类的构造方法
    // class User{
    //     constructor(name){
    //         this.name = name;
    //     }
    //     getName(){
    //         return this.name;
    //     }
    // }

    // class Admin extends User{
    //     // constructor(name){
    //     //     super(name);
    //     // }
    // }

    // const hd = new Admin("后盾人");
    // console.log(hd.getName());

    //下面通过父类方法获取课程总价
//     class Controller{
//         sum(){
//             return this.data.reduce((t,c) => t + c.price ,0);
//         }
//     }

//     class Lesson extends Controller{
//         constructor(lessons){
//             super();
//             this.data = lessons;
//         }
//         info(){
//             return {
//                 totalPrice : super.sum(),
//                 data : this.data
//             }
//         }
//     }

//     let data = [
//         {name : "js" , price : 100},
//         {name : "mysql" , price : 212},
//         {name : "vue.js" , price : 98}
//     ];

//     const hd = new Lesson(data);
//    console.log(hd.info());




//方法覆盖
//子类存在父类同名方法时使用子类方法
// class User{
//     constructor(name){
//         this.name = name;
//     }
//     say(){
//         return this.name;
//     }
// }

// class Admin extends User{
//     constructor(name){
//         super(name);
//     }
//     say(){
//         return "后盾人:" + super.say();
//     }
// }



// const xj = new Admin("向军");
// console.log(xj.say());


//下面是覆盖父类的方法，只获取课程名称
//
// class Controller{
//     say(){
//         return this.name;
//     }
//     total(){
//         return this.data.reduce((t,c) => t + c.price,0);
//     }
//     getByKey(key){
//         return this.data.filter(item => item.name.includes(key));
//     }
// }

// class Lesson extends Controller{
//     constructor(lessons){
//         super();
//         this.data = lessons;
//     }
//     getByKey(key){
//         return super.getByKey(key).map(item=>item.name);
//     }
// }

// let data = [
//     {name : "js",price:100},
//     {name : "mysql",price:212},
//     {name : "vue.js",price:98}
// ];

// const hd = new Lesson(data);
// console.log(hd.getByKey("js"));



//静态继承
//静态的属性和方法也是可以被继承的，下面是原理分析
// function User(){}
// //添加静态属性
// User.site = "后盾人";
// //添加静态方法
// User.url = function(){
//     return "houdunren.com";
// }

// function Admin(){}
// Admin.__proto__ = User;



// console.dir(Admin.url());


//下面使用 
// class User{
//     static site = "后盾人";
//     static host(){
//         return 'houdunren.com';
//     }
// }

// class Admin extends User{}

// console.dir(Admin.host());


















    
</script>